#ifndef UPDATER_H
#define UPDATER_H

#include <rtdevice.h>

#define DEFAULT_DOWNLOAD_PART "download"

#define CMD_CTL 0X5550        //控制指令
#define CMD_CTL_REPLY 0X5580  //控制指令应答
#define CMD_DOWN 0X5551       //数据下载指令
#define CMD_DOWN_REPLY 0X5581 //数据下载指令应答
#define CMD_PACK 0X5552       //数据包接收
#define CMD_PACK_REPLY 0X5582 //数据包接收应答

//可能传输的固件最长长度，字节; 2M
#define MAX_FW_SIZE (1024 * 1024 * 2)

//每次传输的数据包长度(x2)，必须小于upacker的长度，视mcu资源分配
#define MAX_FW_PACK_SIZE 1024

#define OTA_TYPE_DOWN 1 //全量下载
#define OTA_TYPE_DIFF 2 //差分下载

typedef struct {
  uint32_t ota_type;     // 固件的类型
  uint32_t fw_size;      // 要下载的固件字节长度
  uint32_t fw_pack_size; //要下载的固件分包的包长
  uint32_t fw_pack_num;  //要下载的固件分包的数量
} update_header_inst;

typedef struct {
  uint8_t packer_buff1[MAX_FW_PACK_SIZE]; //接收数据缓冲区1
  uint8_t packer_buff2[MAX_FW_PACK_SIZE]; //接收数据缓冲区2
  uint8_t *index_list;                    //所有数据包的确认标记
  uint16_t index_list_len;                // list的长度
  uint16_t index_cur; //当前传递的包索引，从0开始算
  uint8_t index_win; //记录当前传递进度的滑动窗口
} update_worker_inst;

#endif // !UPDATER_H